package singleton;

/**
 * @author: zhouyang
 * @descrpition: 并发安全 双重检测加锁
 * @time: 2019-05-24 20:16
 */
public class Singleton_2 {

    //必须加上关键字volatile 保证线程间的改动都是可见的
    private static volatile Singleton_2 singleton = null;

    //私有化构造方法
    private Singleton_2(){
    }

    //双重检测 同一时间可以有多个线程进入此区域 但是只有一个方法被加锁创建 后续的可见到变量不为null 也就不会多次创建
    public static Singleton_2 getInstance(){
        if(singleton == null){
            synchronized (Singleton_2.class){
                if(singleton == null) {
                    singleton = new Singleton_2();
                }
            }
        }
        return singleton;
    }
}
